package com.itheima.controller;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.List;

/**
 * @author zr
 * @version 1.0
 * @date 2021/6/27 6:03
 */
@RestController
@RequestMapping("/file")
public class FileUpLoadController {
    @RequestMapping("/up")
    public void fileUpLoad(HttpServletRequest request) throws Exception {
        //这里已经获得了流数据，接下来你将图片流数据做一个封装就好
        //但是commonFileUpload已经帮我们完成了上传数据的封装，MultipartFile就是用的这个jar包了

            //以下三行代码功能: 通过request.getInputStream();获取到请求体的全部内容
            //进行解析,将每对分割线中的内容封装在了FileItem对象中
            DiskFileItemFactory fac=new DiskFileItemFactory();
            ServletFileUpload upload=new ServletFileUpload(fac);
            List<FileItem> list=upload.parseRequest(request);
            //4_遍历集合
            for (FileItem item : list) {
                if(item.isFormField()){
                    //如果当前对象不是上传项
                }else{
                    //6_如果当前的FileItem对象是上传项
                    //通过FileItem获取到输入流对象,通过输入流可以获取到图片二进制数据
                    //通过FileItem获取到输入流对象,通过输入流可以获取到图片二进制数据
                    InputStream is=item.getInputStream();
                    String realPath = "fileupload/src/image";
                    //在服务端创建一个空文件(后缀必须和上传到服务端的文件名后缀一致)
                    File file=new File(realPath);
                    if(!file.exists()){
                        file.mkdirs();
                    }
                    //建立和空文件对应的输出流
                    OutputStream os=new FileOutputStream(new File(realPath+"/"+item.getName()));
                    //将输入流中的数据刷到输出流中
                    //释放资源
                    IOUtils.copy(is, os);
                    IOUtils.closeQuietly(is);
                    IOUtils.closeQuietly(os);
                }
            }

    }
}
